package board;

import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.util.ArrayList;

import org.apache.ibatis.session.SqlSession;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

public class BoardMyba {

	private SqlSession session;// 커넥션 객체가 생성한 상태
	BoardVo boardvo;
	private String uploadPath = "C:\\workspace\\test1\\WebContent\\upload";// uploadPath
	int fileSize = 10 * 1024 * 1024;

	String fileEncoding = "UTF-8";
	// 페이지 분리 관련 필드
	private int listSize = 3;// 한페이지에 보여질 행수

	private int blockSize = 2;// 보여질 페이지 이동 번호 수.

	private int totSize = 0;// 검색된 데이터의 총 갯수
	private int totPage = 0;// 전체페이지수
	private int totBlock = 0;// 전체 블럭수

	private int nowPage = 1;// 현재 페이지
	private int nowBlock = 1;// 현재 블럭

	private int startNo = 1;// 목록의 시작 위치
	private int endNo = 3;// 목록의 끝 위치
	private int startPage = 1; // 현재 블럭의 시작 페이지번호
	private int endPage = 2;// 현재 블럭의 끝 페이지 번호

	public String getUploadPath() {
		return uploadPath;
	}

	public void setUploadPath(String uploadPath) {
		this.uploadPath = uploadPath;
	}

	public BoardVo getBoardvo() {
		return boardvo;
	}

	public void setBoardvo(BoardVo boardvo) {
		this.boardvo = boardvo;
	}

	public BoardMyba() {
		try {
			session = BoardFactory.getFactory().openSession();
			// Board에서 드라이버를 연결할 때 사용하던 것을 한줄로 표현.
			// 최초 접속한 사용자는 초기화되지만, 두번째 접속한 사용자 초기화 되지 않는다.-->static 형태의 특징
			// ex) static int tot=0;
			// tot = tot+10;

		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

	public void computePage() {
		totPage = (int) Math.ceil(totSize * 1.0 / listSize);// ceil은 반환타입이 long
															// type이며 정수형으로 바꿔주고
															// 1.0을 곱하기
															// 때문에계산해야지됨!
		totBlock = (int) Math.ceil(totPage * 1.0 / blockSize);

		nowBlock = (int) Math.ceil(nowPage * 1.0 / blockSize);// 현재페이지

		endPage = nowBlock * blockSize;// 총 페이지가 7이고, 현재페이지 3 블럭 2 이면
										// 12|34|56|7X X페이지는
		startPage = endPage - blockSize + 1;
		if (totPage < endPage)
			endPage = totPage; // 총 페이지 수 7을 마지막 페이지로 고정시켜주는거!

		endNo = nowPage * listSize;
		startNo = endNo - listSize + 1;
		if (totSize < endNo)
			endNo = totSize;
	}

	public ArrayList<BoardVo> list() {
		ArrayList<BoardVo> v = null;
		try {
			BoardVo bv = (BoardVo) session.selectOne("board.page", boardvo); // vo
																				// -->Member라고
																				// 저장되어있는object형으로
																				// 값을
																				// 넘김//값을
																				// 하나만
																				// 선택할
																				// 때-->
																				// selectOne

			totSize = bv.getTotSize();
			computePage();
			boardvo.setStartNo(startNo);
			boardvo.setEndNo(endNo);

			v = (ArrayList) session.selectList("board.select", boardvo); // object형으로
																			// 반환되기
																			// 때문에
																			// Map(selectList)형태로
																			// 전달

			session.close();// session을 닫아주지 않으면, Memory overflow라는 에러가 남

		} catch (Exception ex) {
			ex.printStackTrace();

		}
		return v;
	}

	public BoardVo view() {
		BoardVo v = null;
		try {

			int cnt = session.update("board.update_hit", boardvo);

			// mybatis는 commit이 false이기 때문에 commit을 날려줘야한다.

			if (cnt > 0) {
				v = (BoardVo) session.selectOne("board.view", boardvo);
				session.commit();
			} else {
				session.rollback();
			}

		} catch (Exception ex) {
			ex.printStackTrace();

		}

		return v;
	}


	
	   public boolean delete() {
		      boolean flag = false;
		      try {
		         
		    	  //board.xml의 delete 쿼리 실행된다면 
		         if (session.delete("board.delete", boardvo) > 0) flag=true;
		         
		         //파일이름이 있을 때, 파일이름을 가지고 파일을 새로 생성하고,
		         if (boardvo.getFilename()!=null && !boardvo.getFilename().equals("")){
		            File file = new File(getUploadPath() + "/" + boardvo.getFilename());
		            //파일이 존재한다면, 데이터를 지우고, 저장된 이미지 파일도 지워준다.
		            if (file.exists()) file.delete(); 
		            if (session.delete("board.fileDel", boardvo) > 0) flag=true;
		         }
		         
		         //위의 값 즉,데이터 값과 파일이름이 있다면 삭제한 것을 db에 저장!! 아니라면 취소!!
		         if(flag) session.commit();
		         else session.rollback();
		         session.close();

		      } catch (Exception e) {
		         e.printStackTrace();
		      }
		      return flag;
		   }

	   
	   
	   
	public boolean insert() {
		boolean flag = false;
		try {

			int sql = session.insert("board.insert", boardvo);
			if (sql > 0) {
				session.commit();
			} else {
				session.rollback();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return flag;
	}

	public boolean modify() {
		boolean flag = false;

		try {
			try {

				MultipartRequest mr = new MultipartRequest(
						boardvo.getRequest(), uploadPath, fileSize,
						fileEncoding, new DefaultFileRenamePolicy());

				String subject = mr.getParameter("subject");
				String content = mr.getParameter("content");
				String pwd = mr.getParameter("pwd");
				String filename = mr.getOriginalFileName("filename");
				String sysfile = mr.getFilesystemName("newfilename");
				int serial = Integer.parseInt(mr.getParameter("serial"));
				String fileDelFlag = mr.getParameter("fileDelFlag");

				boardvo.setSubject(subject);
				boardvo.setContent(content);
				boardvo.setPwd(pwd);
				boardvo.setFilename(filename);
				boardvo.setSysfile(sysfile);
				boardvo.setSerial(serial);
				boardvo.setFileDelFlag(fileDelFlag);

				// (Board)글만 업데이트
				int cnt = session.update("board.update", boardvo);
				if (cnt > 0) {
					session.commit();
					flag = true;
				}

				// (brdFiles)에 들어있는 파일 삭제버튼을 눌렀으면 파일 삭제
				if (boardvo.getFileDelFlag().equals("del")) {
					session.delete("board.fileDel", boardvo);
					session.commit();
					flag = true;
				} else {
					session.rollback();
				}

				if (boardvo.getSysfile() != null) {

					if (session.insert("board.newFile", boardvo) > 0) {
						session.commit();
						flag = true;

					}

				}
			} catch (IOException io) {

			}
		} catch (Exception ex) {
			ex.printStackTrace();

		}

		return flag;
	}
}
